using Godot;
using System;

public partial class Weather : Node2D
{
	[Export] public float MinRainDuration = 30.0f;  // 最短下雨时间（秒）
	[Export] public float MaxRainDuration = 120.0f; // 最长下雨时间（秒）
	[Export] public float MinClearDuration = 10.0f;  // 最短晴天时间（秒）
	[Export] public float MaxClearDuration = 30.0f; // 最长晴天时间（秒）
	
	private Node2D _rainNode;
	private Timer _weatherTimer;
	private bool _isRaining = false;
	private Random _random = new Random();
	
	// 天气状态枚举
	public enum WeatherState
	{
		Clear,  // 晴天
		Raining // 下雨
	}
	
	private WeatherState _currentWeather = WeatherState.Clear;
	
	public override void _Ready()
	{
		// 查找雨效果节点
		_rainNode = GetNode<Node2D>("Rain");
		
		// 创建定时器
		_weatherTimer = new Timer();
		AddChild(_weatherTimer);
		_weatherTimer.Timeout += OnWeatherTimerTimeout;
		_weatherTimer.OneShot = true;
		
		// 初始化为晴天，雨效果关闭
		SetRainVisible(false);
		
		// 开始第一个天气周期
		StartNextWeatherCycle();
	}
	
	private void OnWeatherTimerTimeout()
	{
		// 切换天气状态
		if (_currentWeather == WeatherState.Clear)
		{
			StartRain();
		}
		else
		{
			StopRain();
		}
		
		// 开始下一个天气周期
		StartNextWeatherCycle();
	}
	
	private void StartRain()
	{
		_currentWeather = WeatherState.Raining;
		_isRaining = true;
		SetRainVisible(true);
		
		GD.Print("开始下雨了！");
		
		// 这里可以添加其他下雨时的效果
		// 比如音效、环境光线变化等
	}
	
	private void StopRain()
	{
		_currentWeather = WeatherState.Clear;
		_isRaining = false;
		SetRainVisible(false);
		
		GD.Print("雨停了，天气转晴！");
		
		// 这里可以添加其他天晴时的效果
	}
	
	private void SetRainVisible(bool visible)
	{
		if (_rainNode != null)
		{
			_rainNode.Visible = visible;
			
			// 如果有粒子系统，也要控制它们的发射
			var raindrops = _rainNode.GetNode<GpuParticles2D>("Raindrop");
			var rainBloom = _rainNode.GetNode<GpuParticles2D>("RainBloom");
			
			if (raindrops != null)
			{
				raindrops.Emitting = visible;
			}
			
			if (rainBloom != null)
			{
				rainBloom.Emitting = visible;
			}
		}
	}
	
	private void StartNextWeatherCycle()
	{
		float duration;
		
		if (_currentWeather == WeatherState.Clear)
		{
			// 当前是晴天，设置下次下雨的时间
			duration = (float)_random.NextDouble() * (MaxClearDuration - MinClearDuration) + MinClearDuration;
		}
		else
		{
			// 当前在下雨，设置雨停的时间
			duration = (float)_random.NextDouble() * (MaxRainDuration - MinRainDuration) + MinRainDuration;
		}
		
		_weatherTimer.WaitTime = duration;
		_weatherTimer.Start();
		
		GD.Print($"下一次天气变化将在 {duration:F1} 秒后发生");
	}
	
	// 公共方法：获取当前天气状态
	public WeatherState GetCurrentWeather()
	{
		return _currentWeather;
	}
	
	// 公共方法：检查是否在下雨
	public bool IsRaining()
	{
		return _isRaining;
	}
	
	// 公共方法：手动开始下雨（用于测试）
	public void ForceStartRain()
	{
		_weatherTimer.Stop();
		StartRain();
		StartNextWeatherCycle();
	}
	
	// 公共方法：手动停止下雨（用于测试）
	public void ForceStopRain()
	{
		_weatherTimer.Stop();
		StopRain();
		StartNextWeatherCycle();
	}
}
